package OOP;

/**
 * Java核心类库示例
 * 演示内容：
 * 1. 字符串操作
 * 2. 包装类型使用
 * 3. JavaBean规范实现
 * 4. 枚举类型应用
 */
public class CoreClassDemo {


    static class Person {

        private String name;    // 私有字段保证封装性
        private int age;

        // 无参构造器（符合JavaBean规范）
        public Person() {}

        // 全参构造器（可选）
        public Person(String name, int age) {
            this.setName(name); // 复用setter方法进行校验
            this.setAge(age);
        }

        // Getter/Setter方法（命名规范）
        public String getName() {
            return name;
        }

        /**
         * 设置姓名（包含数据校验）
         * @param name 不能为空且长度>1
         * @throws IllegalArgumentException 参数不合法时抛出
         */
        public void setName(String name) {
            if (name == null || name.trim().length() < 2) {
                throw new IllegalArgumentException("姓名必须至少2个字符");
            }
            this.name = name.trim();
        }

        public int getAge() {
            return age;
        }

        /**
         * 设置年龄（包含数据校验）
         * @param age 必须为0-150之间的整数
         */
        public void setAge(int age) {
            if (age < 0 || age > 150) {
                throw new IllegalArgumentException("年龄必须在0-150之间");
            }
            this.age = age;
        }

        // 重写toString方法（标准实践）
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
    }

    // 枚举定义在类级别（Java 8规范）
    // java8不支持在方法内部定义枚举，枚举必须定义在类的顶层或者作为内部类
    enum Color {
        RED("#FF0000"),
        GREEN("#00FF00"),
        BLUE("#0000FF");

        private final String hexCode;

        Color(String hexCode) {
            this.hexCode = hexCode;
        }

        public String getHexCode() {
            return hexCode;
        }
    }

    /**
     * 核心类库使用演示
     */
    public static void classesCoreExample() {
        // 1. 字符串操作演示
        String name = "  Alice Smith  ";
        System.out.println("原始字符串: " + name);
        System.out.println("去空格后: " + name.trim());
        System.out.println("大写转换: " + name.toUpperCase());
        System.out.println("分割结果: " + String.join("|", name.split(" ")));

        // 2. 包装类型操作
        Integer age = 25;
        System.out.println("\n包装类型解析: " + Integer.parseInt("100"));
        System.out.println("十六进制表示: " + Integer.toHexString(255));

        // 3. JavaBean使用
        Person person = new Person();   // 通过new操作符创建新的instance，然后用变量指向它，指向instance的变量都是引用变量。
        person.setName("Bob");
        person.setAge(30);
        System.out.println("\nJavaBean演示: " + person);

        // 4. 枚举类型使用
        Color color = Color.GREEN;
        System.out.println("\n枚举演示: " + color);
        System.out.println("颜色编码: " + color.getHexCode());
    }

    public static void main(String[] args) {
        classesCoreExample();

        // 测试异常情况（可选）
        try {
            Person p = new Person();
            p.setName("A"); // 触发异常
        } catch (IllegalArgumentException e) {
            System.out.println("\n异常捕获测试: " + e.getMessage());
        }
    }
}